#include <stdio.h>
#define LIMIT 30

/*
 * 编辑一个函数,读取字符串的输入,直到读到文件的结尾,打印字符串,需要实现命令行参数
 * -u  转换成大写字符,  -l  转换成小写字符,   -p (默认)按照原样打印
 */

char *s_gets(char *str, int n);
char get_parameter(char **argv);
void print_string(char *);

int main(int argc, char *argv[])
{
    char parameter;     //控制台参数
    char string[LIMIT]; //实际的程序获取到的字符串
    int isquit = 1;     //1为程序运行,0为退出,需要手动置零

    //argc为传入的字符串的数量,argv为传入的字符串的指针的指针,它指向的指针为字符串的开头
    for (int i = 0; i < argc; i++)
    {
        puts(argv[i]);
        //打印出每一参数的值
    }

    /**
     * @brief 检测输入的参数的个数是否符合要求,不符合直接退出,并打印提示
     * 
     */
    if (argc = 2)
    {
        parameter = 'p';
    }
    
    if (argc > 3)
    {
        printf("The args nums are INVALID!\n");
        return -1;
    }

    if (*argv[1] != '-')
    {
        printf("The args structure are INVALID!\n");
        return -1;
    }
    parameter = get_parameter(argv);
    printf("your choice is %c",parameter);
    // if (parameter != )
    // {
    //     /* code */
    // }
    s_gets(string,LIMIT);
    puts(string);

    //控制台参数到此结束

    //获取字符串的输入
    while (isquit) //s_gets函数实际有返回值,为char* 即字符串的开头)
    {
        switch (parameter)
        {
        case 'P':
        case 'p':
            print_string(string);
            break;
        case 'U':
        case 'u':
            print_string(string);
            break;
        case 'L':
        case 'l':
            print_string(string);
            break;

        default:
            print_string(string);
            break;
        }
        isquit = 0;
    }

    return 0;
}

/**
 * @brief fgets()函数会将输入的\n符号也进行保留,这个函数为了弥补fgets函数的缺陷,把末尾的\n替换成\0结尾
 * 
 * @param str 输入的字符串的指针
 * @param n 输入的取值,利用fgets函数的第二个参数实现
 * @return char* 字符串的地址值
 */
char *s_gets(char *str, int n)
{
    char *return_val;
    int count = 0;

    return_val = fgets(str, n, stdin);

    if (return_val) //到这里return_val不是NULL,代表fgets()成功获取到了字符串,进行\n的替换
    {
        while (*str != '\n' && *str != '\0')
        {
            str++; //进行下一个字符的判断
            if (*str == '\n')
            {
                *str = '\0';
            }
            else //这个else必须要想到
            {    //将剩余的留在缓冲区的字符排除
                while (getchar() != '\n')
                {
                    continue;
                }
            }
        }

        // 可以使用string.h中定义的strchr()函数查找最近的值
        // char *addr;
        // addr = strchr(str, '\n');
        // if (addr)
        // {
        //     *addr = '\0';
        // }else{
        //      while (getchar() != '\n')
        //      {
        //            continue;
        //      }
        // }
    }
    return return_val;
}

/**
 * @brief 只适用于处理好的-c -v -s类参数
 * 
 * @param argv 
 * @return char 
 */
char get_parameter(char **argv)
{
    //这里必须处理传入的字符串,不能直接返回
    if (argv[1][0] == '-')
    {
        return argv[1][1];
    }
}

void print_string(char *str)
{
    puts(str);
}